package system

import (
	"5title_gin/common/crud"
	"5title_gin/global"
	"5title_gin/internal/api/middleware"
	"5title_gin/internal/model"
	"5title_gin/internal/model/system"
	"5title_gin/pkg/utils/res"
	"github.com/gin-gonic/gin"
	"time"
)

type QueryDept struct {
	ID uint `binding:"required" json:"id" label:"id"`
}

// DeptList 列表对象
type DeptList struct {
	ID        uint        `json:"id"`
	CreatedAt time.Time   `json:"date"`
	DeptName  string      `json:"name"`
	OrderNum  int         `json:"sort"`
	Status    string      `json:"status"`
	Children  []*DeptList `json:"children"`
}

// CreateDept 创建部门
// @Tags 部门管理
// @Summary 创建部门
// @Description 创建一个新的部门
// @Param token header string true "token"
// @Param data body dept.SysDept true "部门信息"
// @Router /api/dept/create [post]
// @Produce json
// @Success 200 {object} res.Response

func (api *SystemApi) CreateDept(c *gin.Context) {
	deptData := middleware.GetBind[system.SysDept](c)
	if err := global.DB.Create(&deptData).Error; err != nil {
		res.Error("创建失败", err, c)
		return
	}
	res.OkWithMsg("部门创建成功！", c)
}

// GetDeptList 获取部门列表
func (api *SystemApi) GetDeptList(c *gin.Context) {
	deptCRUD := crud.NewCRUD[system.SysDept](global.DB)
	deptList, err := deptCRUD.GetAll()
	if err != nil {
		res.Error("获取部门列表失败", err, c)
		return
	} else {
		res.OkWithData(deptList, c)
	}
}

// GetDeptByID 获取单个部门信息
func (api *SystemApi) GetDeptByID(c *gin.Context) {
	cr := middleware.GetBind[QueryDept](c)

	var department system.SysDept // 定义变量存储查询结果

	if err := global.DB.Where("id = ?", cr.ID).First(&department).Error; err != nil {
		res.Error("获取部门信息失败", err, c)
		return
	}

	res.OkWithData(department, c) // 这里返回查询到的具体数据
}

// UpdateDept 更新部门信息
func (api *SystemApi) UpdateDept(c *gin.Context) {

}

// DeleteDept 删除部门
func (api *SystemApi) DeleteDept(c *gin.Context) {

}

// GetDeptOptions 获取上级部门列表
func (api *SystemApi) GetDeptOptions(c *gin.Context) {
	var parentId = 0
	var departments []model.KVModel
	// 查询 parent_id = 0 的部门
	if err := global.DB.Table("sys_depts").Where("parent_id = ?", parentId).Select("id as name, dept_name as value").Find(&departments).Error; err != nil {
		res.FailWithMsg("查询失败", c)
		return
	}
	res.OkWithData(departments, c)
}
